﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAL
{
    public partial class RecepcionDoc
    {

        public int idAudit { get; set; }



        public string getCorrelativo(dbGestionDataContext _db, int idObra)
        {
            string numDocumento = "";

            
                                                 
            var q = from a in _db.RecepcionDocs
                    where a.idObra == idObra
                    group a by a.idObra into g
                    select new
                    {
                        idObra = g.Key,
                        numDocumento = g.Max(p => p.numRecepcion)
                    };



            if (q.Count() == 0)
            {
                numDocumento = "000001";
            }
            else
            {
                int numActual = int.Parse(q.First().numDocumento);
                numActual++;


                if (numActual < 10)
                {
                    numDocumento = "00000" + numActual.ToString();
                }
                else if (numActual < 100)
                {
                    numDocumento = "0000" + numActual.ToString();
                }
                else if (numActual < 1000)
                {
                    numDocumento = "000" + numActual.ToString();
                }
                else if (numActual < 10000)
                {
                    numDocumento = "00" + numActual.ToString();
                }
                else if (numActual < 100000)
                {
                    numDocumento = "0" + numActual.ToString();
                }
                else if (numActual < 1000000)
                {
                    numDocumento = numActual.ToString();
                }
                else if (numActual > 1000000)
                {
                    throw new Exception("Limite  de Correlativo Comparativo");
                }


            }
            return numDocumento;

        }

        public decimal GetTotalFacturadoXOrdenCompra(dbGestionDataContext _db,
                                            int idOrden)
        {
            decimal  total=0;
            var q = (from a in _db.RecepcionDocs
                    where a.idOrden == idOrden
                    select a).Sum(p=>p.totalMonOrig);
            if(q.HasValue)
            {
                total=q.Value;
            }
            return total;


        }
     


        public int getidAnterior(dbGestionDataContext _db, int idinternal, int idObra)
        {
            int intAnterior = 0;


            var id = from i in _db.RecepcionDocs
                     where i.idInternal < idinternal && i.idObra == idObra
                     group i by i.idObra into g
                     select new
                     {
                         idAnterior = g.Max(p => p.idInternal)
                     };

            if (id.Count() > 0)
            {
                intAnterior = id.First().idAnterior;

            }
            else
            {
                throw new Exception("No existe Registros");
            }


            return intAnterior;

        }

        public int getidSiguiente(dbGestionDataContext _db, int idinternal, int idObra)
        {
            int intSiguiente = 0;


            var id = from i in _db.RecepcionDocs
                     where i.idInternal > idinternal && i.idObra == idObra
                     group i by i.idObra into g
                     select new
                     {
                         idSiguiente = g.Min(p => p.idInternal)
                     };


            if (id.Count() > 0)
            {
                intSiguiente = id.First().idSiguiente;

            }
            else
            {
                throw new Exception("No existe Registros");
            }

            return intSiguiente;
        }

        public bool add(dbGestionDataContext _db,
                        int?  idOrden,
                        int? idOrdenAnticipo,
                        int? idRendicion,
                        int idObra,
                        string numRecepcion,
                        string descripcion,
                        string numDocumento,
                        int tipoDocumento,
                        string tipoOrigenGP,
                        int idmoneda,
                        decimal totalMonOrig,
                        decimal totalDoc,
                        decimal netoDoc,
                        decimal igvDoc,
                        decimal totalMN,
                        decimal netoMN,
                        decimal igvtotalMN,
                        decimal impoInafecto,
                        decimal impISC,
                        decimal renta4taDoc,
                        int numDiasVen,
                        DateTime? fechaEmisionDoc,  //caso de caja chica no tiene
                        DateTime? fechaVencimientoDoc, //caso de caja chica no tiene
                        DateTime fechaRecep,
                        DateTime? fechaPago,
                        decimal tipoCambioDollar,
                        int usuarioCre,
                        char tipoProveedor,
                        int? idProveedor,
                        int? idEmpleado,
                        string ruc,
                        decimal IGV,
                        string proveedor,
                        decimal totalUS)
        {

            this.impISC = impISC;
            this.numDiasVen = numDiasVen;
            this.impInafecto = impoInafecto;
            
            this.numRecepcion=numRecepcion;
            this.descripcion=descripcion;
            this.idOrdenAnticipo = idOrdenAnticipo;
            this.numDocumento=numDocumento;
            this.idTipoDocumento=tipoDocumento;
            
            
            //-----------
            this.tipoProveedor = tipoProveedor;//tipoAnexo   P/H/T
            this.idProveedor=idProveedor;
            this.idEmpleado = idEmpleado;
            //------------------

            this.ruc=ruc ;
            this.IGV=IGV;
            this.proveedor=proveedor;
            this.totalUS = totalUS;



    this.idmoneda=idmoneda;
    this.totalMN=totalMN;
    this.netoMN=netoMN;
    this.igvtotalMN=igvtotalMN;
    
            this.fechaEmisionDoc=fechaEmisionDoc;
    this.fechaVencimientoDoc=fechaVencimientoDoc;
    this.fechaRecep=fechaRecep;

    this.usuarioCre=usuarioCre;
    this.fechaCre=DateTime.Now;
    this.usuarioMod=usuarioCre;
    this.fechaMod=DateTime.Now;
    this.idOrden= idOrden;
    this.tipoCambio = tipoCambioDollar;
    this.idObra = idObra;
    this.totalMonOrig = totalMonOrig;
    this.fechaPago = fechaPago;
    this.tipoOrigenGP = tipoOrigenGP;
    
    this.totalDoc = totalDoc;
    this.igvDoc = igvDoc;
    this.netoDoc = netoDoc;
    this.renta4taDoc = renta4taDoc;
            
    _db.RecepcionDocs.InsertOnSubmit(this);

            _db.SubmitChanges();
            // auditoria antes de guardar

            AuditRecord auditRecord = new AuditRecord();
            this.idAudit = auditRecord.add(_db,
            DAL.AuditAction.Insert,
            usuarioCre,
            this.idInternal,
            this);




            return true;
        }

        public bool update(dbGestionDataContext _db,
                        int idOrdenCompra,
                        int idObra,
                        string descripcion,
                        string numDocumento,
                        int idtipoDocumento,
                        int idmoneda,
                        decimal totalMonOrig,
                        decimal total,
                        decimal neto,
                        decimal igvtotal,
                        DateTime fechaEmisionDoc,
                        DateTime fechaVencimientoDoc,
                        DateTime fecha,
                        DateTime? fechaPago,
                        decimal tipoCambioDollar ,
                        int usuarioMod)
        {



            this.numRecepcion = numRecepcion;
            this.descripcion = descripcion;
            this.numDocumento = numDocumento;
            this.idTipoDocumento = idtipoDocumento;
            this.idmoneda = idmoneda;
            this.totalMN = total;
            this.netoMN = neto;
            this.tipoCambio = tipoCambioDollar;
            this.igvtotalMN = igvtotal;
            this.fechaEmisionDoc = fechaEmisionDoc;
            this.fechaVencimientoDoc = fechaVencimientoDoc;
            this.fechaRecep = fecha;
            this.usuarioCre = usuarioCre;
            this.fechaCre = DateTime.Now;
            this.usuarioMod = usuarioCre;
            this.fechaMod = DateTime.Now;
            this.idOrden = idOrdenCompra;
            this.idObra = idObra;
            this.totalMonOrig= totalMonOrig;
            this.fechaPago = fechaPago;

            AuditRecord auditRecord = new AuditRecord();
            this.idAudit = auditRecord.add(_db,
                DAL.AuditAction.Update,
                usuarioMod,
                this.idInternal,
                this);


            _db.SubmitChanges();
            return true;
        }


    }
}
